#include "ManagedBlasProvider.h"

 /* Subroutine */int SmartMathLibrary::Blas::Engine::ManagedBlasProvider::srotm_
   (integer *n, real *sx, integer *incx, real *sy, integer *incy, real *sparam)
{
  /* Initialized data */
  static real zero = 0.f;
  static real two = 2.f;
  /* System generated locals */
  integer i__1, i__2;
  /* Local variables */
  static integer i__;
  static real w, z__;
  static integer kx, ky;
  static real sh11, sh12, sh21, sh22, sflag;
  static integer nsteps;
  /*  Purpose   
  =======   
  APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX   
  (SX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF SX ARE IN   
  (DX**T)   
  SX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE   
  LX = (-INCX)*N, AND SIMILARLY FOR SY USING USING LY AND INCY.   
  WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..   
  SFLAG=-1.E0     SFLAG=0.E0        SFLAG=1.E0     SFLAG=-2.E0   
  (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0)   
  H=(          )    (          )    (          )    (          )   
  (SH21  SH22),   (SH21  1.E0),   (-1.E0 SH22),   (0.E0  1.E0).   
  SEE  SROTMG FOR A DESCRIPTION OF DATA STORAGE IN SPARAM.   
  Arguments   
  =========   
  N      (input) INTEGER   
  number of elements in input vector(s)   
  SX     (input/output) REAL array, dimension N   
  double precision vector with 5 elements   
  INCX   (input) INTEGER   
  storage spacing between elements of SX   
  SY     (input/output) REAL array, dimension N   
  double precision vector with N elements   
  INCY   (input) INTEGER   
  storage spacing between elements of SY   
  SPARAM (input/output)  REAL array, dimension 5   
  SPARAM(1)=SFLAG   
  SPARAM(2)=SH11   
  SPARAM(3)=SH21   
  SPARAM(4)=SH12   
  SPARAM(5)=SH22   
  =====================================================================   
  Parameter adjustments */
  --sparam;
  --sy;
  --sx;
  /* Function Body */
  sflag = sparam[1];
  if (*n <= 0 || sflag + two == zero)
  {
    goto L140;
  }
  if (!(*incx ==  *incy &&  *incx > 0))
  {
    goto L70;
  }
  nsteps =  *n **incx;
  if (sflag < 0.f)
  {
    goto L50;
  }
  else if (sflag == 0)
  {
    goto L10;
  }
  else
  {
    goto L30;
  }
  L10: sh12 = sparam[4];
  sh21 = sparam[3];
  i__1 = nsteps;
  i__2 =  *incx;
  for (i__ = 1; i__2 < 0 ? i__ >= i__1: i__ <= i__1; i__ += i__2)
  {
    w = sx[i__];
    z__ = sy[i__];
    sx[i__] = w + z__ * sh12;
    sy[i__] = w * sh21 + z__;
    /* L20: */
  }
  goto L140;
  L30: sh11 = sparam[2];
  sh22 = sparam[5];
  i__2 = nsteps;
  i__1 =  *incx;
  for (i__ = 1; i__1 < 0 ? i__ >= i__2: i__ <= i__2; i__ += i__1)
  {
    w = sx[i__];
    z__ = sy[i__];
    sx[i__] = w * sh11 + z__;
    sy[i__] =  - w + sh22 * z__;
    /* L40: */
  }
  goto L140;
  L50: sh11 = sparam[2];
  sh12 = sparam[4];
  sh21 = sparam[3];
  sh22 = sparam[5];
  i__1 = nsteps;
  i__2 =  *incx;
  for (i__ = 1; i__2 < 0 ? i__ >= i__1: i__ <= i__1; i__ += i__2)
  {
    w = sx[i__];
    z__ = sy[i__];
    sx[i__] = w * sh11 + z__ * sh12;
    sy[i__] = w * sh21 + z__ * sh22;
    /* L60: */
  }
  goto L140;
  L70: kx = 1;
  ky = 1;
  if (*incx < 0)
  {
    kx = (1- *n) **incx + 1;
  }
  if (*incy < 0)
  {
    ky = (1- *n) **incy + 1;
  }
  if (sflag < 0.f)
  {
    goto L120;
  }
  else if (sflag == 0)
  {
    goto L80;
  }
  else
  {
    goto L100;
  }
  L80: sh12 = sparam[4];
  sh21 = sparam[3];
  i__2 =  *n;
  for (i__ = 1; i__ <= i__2; ++i__)
  {
    w = sx[kx];
    z__ = sy[ky];
    sx[kx] = w + z__ * sh12;
    sy[ky] = w * sh21 + z__;
    kx +=  *incx;
    ky +=  *incy;
    /* L90: */
  }
  goto L140;
  L100: sh11 = sparam[2];
  sh22 = sparam[5];
  i__2 =  *n;
  for (i__ = 1; i__ <= i__2; ++i__)
  {
    w = sx[kx];
    z__ = sy[ky];
    sx[kx] = w * sh11 + z__;
    sy[ky] =  - w + sh22 * z__;
    kx +=  *incx;
    ky +=  *incy;
    /* L110: */
  }
  goto L140;
  L120: sh11 = sparam[2];
  sh12 = sparam[4];
  sh21 = sparam[3];
  sh22 = sparam[5];
  i__2 =  *n;
  for (i__ = 1; i__ <= i__2; ++i__)
  {
    w = sx[kx];
    z__ = sy[ky];
    sx[kx] = w * sh11 + z__ * sh12;
    sy[ky] = w * sh21 + z__ * sh22;
    kx +=  *incx;
    ky +=  *incy;
    /* L130: */
  }
  L140: return 0;
} /* srotm_ */
